Various Interactive Plots using Plotly Package (2)
Package
plotly(Ver. 4.9.3)는 Interactive Graph를 생성할 수 있는 Package이다. 여기서 Interactive Graph란 마우스 움직임에 반응하며 실시간으로 형태가 변하는 그래프를 말한다. Interactive Graph를 생성하면 그래프를 자유롭게 조작하면서 관심 있는 부분을 자세히 살펴볼 수 있으며, HTML 포맷으로 저장하면 일반 사용자들도 웹 브라우저를 이용해 그래프를 조작할 수 있다.
pacman::p_load("plotly")
plotly를 이용하여 Interactive Graph를 생성하기
위해 주식 데이터를 사용한다.quantmod에서 제공하는 함수
getSymbols()를 통해 불러올 수 있다.getSymbols()의 첫 번째 인자로 주식 데이터를
가져오고자 하는 종목 코드 번호를 지정해야 하는데, 종목 코드 번호는 네이버 금융에서 쉽게 찾을 수 있다.
pacman::p_load("quantmod") # 주식 데이터 불러오는 Package
# 삼성성
samsung <- getSymbols("005930.KS", # 가져오고자 하는 종목 코드 번호, KOSPI는 뒤에 KS, KOSDAQ은 KQ from = "2018-01-01", # 주식 정보를 가져오고자 하는 시작 날짜
to = "2022-11-16", # 주식 정보를 가져오고자 하는 마지막 날짜날짜
auto.assign = FALSE) # 코드 번호("005930.KS") 객체에 데이터 저장할 것인지 여부NAcolnames(samsung) <- c("Open", # 시가가
"High", # 고가가
"Low", # 저가
"Close", # 종가가
"Volume", # 거래량래량
"Adjusted") # 수정율
head(samsung)
Open High Low Close Volume Adjusted
2018-01-02 51380 51400 50780 51020 8474250 44269.27
2018-01-03 52540 52560 51420 51620 10013500 44789.88
2018-01-04 52120 52180 50640 51080 11695450 44321.33
2018-01-05 51300 52120 51200 52120 9481150 45223.71
2018-01-08 52400 52520 51500 52020 8383650 45136.95
2018-01-09 51460 51720 49980 50400 18013600 43731.30
# 카카오
kakao <- getSymbols("035720.KS",
from = "2018-01-01",
to = "2022-11-16",
auto.assign = FALSE)
colnames(kakao) <- c("Open",
"High",
"Low",
"Close",
"Volume",
"Adjusted")
head(kakao)
Open High Low Close Volume Adjusted
2018-01-02 28205.90 29616.20 28105.17 29515.46 6680627 29427.17
2018-01-03 30321.35 30422.08 29313.99 30019.14 5729670 29929.34
2018-01-04 30724.29 32033.85 30119.88 31429.44 11242421 31335.41
2018-01-05 31630.91 31832.38 30623.55 31429.44 5297057 31335.41
2018-01-08 32336.05 32738.99 31832.38 32134.58 7829439 32038.45
2018-01-09 31832.38 32235.32 31127.23 31630.91 5017557 31536.28
# LG
lg <- getSymbols("003550.KS",
from = "2018-01-01",
to = "2022-11-16",
auto.assign = FALSE)
colnames(lg) <- c("Open",
"High",
"Low",
"Close",
"Volume",
"Adjusted")
head(lg)
Open High Low Close Volume Adjusted
2018-01-02 99716.21 100374.40 97851.33 99606.51 160040 88163.59
2018-01-03 98728.92 99825.91 98290.12 98728.92 217377 87386.82
2018-01-04 98948.32 99606.51 97083.44 97741.63 238149 86512.95
2018-01-05 97851.33 97851.33 96315.55 97412.53 237488 86221.65
2018-01-08 97851.33 99277.41 97412.53 98290.12 211137 86998.44
2018-01-09 98509.52 103994.46 98290.12 102678.08 382637 90882.29
getSymbols()를 통해 불러온 주식 데이터의 데이터
유형은 “xts”로 시계열 구조이다.plotly를 이용하여 주식 데이터를 시각화하기
위해서는 데이터 유형을 “data.frame”으로 변환해야 한다.# Data Frame 변환환
samsung <- samsung %>%
data.frame() %>% # Data Frame 변환환
mutate(Date = rownames(.)) %>% # Date 변수 생성생성
select(Date, everything()) # Date 변수 1열로 이동이동
head(samsung)
Date Open High Low Close Volume Adjusted
2018-01-02 2018-01-02 51380 51400 50780 51020 8474250 44269.27
2018-01-03 2018-01-03 52540 52560 51420 51620 10013500 44789.88
2018-01-04 2018-01-04 52120 52180 50640 51080 11695450 44321.33
2018-01-05 2018-01-05 51300 52120 51200 52120 9481150 45223.71
2018-01-08 2018-01-08 52400 52520 51500 52020 8383650 45136.95
2018-01-09 2018-01-09 51460 51720 49980 50400 18013600 43731.30
kakao <- kakao %>%
data.frame() %>%
mutate(Date = rownames(.)) %>%
select(Date, everything())
lg <- lg %>%
data.frame() %>%
mutate(Date = rownames(.)) %>%
select(Date, everything())
# 데이터 합치기NAdata <- rbind( cbind(samsung, Name = "samsung"),
cbind(kakao, Name = "kakao"),
cbind(lg, Name = "lg"))
head(data)
Date Open High Low Close Volume Adjusted
2018-01-02 2018-01-02 51380 51400 50780 51020 8474250 44269.27
2018-01-03 2018-01-03 52540 52560 51420 51620 10013500 44789.88
2018-01-04 2018-01-04 52120 52180 50640 51080 11695450 44321.33
2018-01-05 2018-01-05 51300 52120 51200 52120 9481150 45223.71
2018-01-08 2018-01-08 52400 52520 51500 52020 8383650 45136.95
2018-01-09 2018-01-09 51460 51720 49980 50400 18013600 43731.30
Name
2018-01-02 samsung
2018-01-03 samsung
2018-01-04 samsung
2018-01-05 samsung
2018-01-08 samsung
2018-01-09 samsung
# Line Plot with Three Stock Data
## Data 변환환
data1 <- data %>%
select(Date, Name, Close)
head(data1)
Date Name Close
2018-01-02 2018-01-02 samsung 51020
2018-01-03 2018-01-03 samsung 51620
2018-01-04 2018-01-04 samsung 51080
2018-01-05 2018-01-05 samsung 52120
2018-01-08 2018-01-08 samsung 52020
2018-01-09 2018-01-09 samsung 50400
data1 <- data1 %>%
tidyr::pivot_wider(names_from = "Name",
values_from = "Close") %>%
data.frame()
head(data1)
Date samsung kakao lg
1 2018-01-02 51020 29515.46 99606.51
2 2018-01-03 51620 30019.14 98728.92
3 2018-01-04 51080 31429.44 97741.63
4 2018-01-05 52120 31429.44 97412.53
5 2018-01-08 52020 32134.58 98290.12
6 2018-01-09 50400 31630.91 102678.08
plot_ly(data1, type = 'scatter', mode = 'lines') %>%
add_trace(x = ~Date, # X축 y = ~samsung, # Y축 name = 'Samsung', # 이름
line = list(color = 'rgb(22, 96, 167)') )%>% # 선 색깔
add_trace(x = ~Date,
y = ~kakao,
name = 'Kakao',
line = list(color = 'rbg(22, 167, 82)') ) %>%
add_trace(x = ~Date,
y = ~lg,
name = 'LG',
line = list(color = 'rgb(153, 22, 167)') ) %>%
layout(yaxis = list(title = "Close")) # Y축 이름
plot_ly(data1, type = 'scatter', mode = 'lines') %>%
add_trace(x = ~Date, # X축 y = ~samsung, # Y축 name = 'Samsung', # 이름
line = list(color = 'rgb(22, 96, 167)') ) %>% # 선 색깔
add_trace(x = ~Date,
y = ~kakao,
name = 'Kakao',
line = list(color = 'rbg(22, 167, 82') ) %>%
add_trace(x = ~Date,
y = ~lg,
name = 'LG',
line = list(color = 'rgb(153, 22, 167)') ) %>%
layout(yaxis = list(title = "Close"), # Y축 이름 xaxis = list(rangeslider = list(type = "date"))) # Add Slider
plot_ly(samsung, type = 'candlestick') %>%
add_trace(x = ~Date,
open = ~Open, close = ~Close,
high = ~High, low = ~Low) %>%
layout(showlegend = FALSE)
plot_ly(samsung, type = 'candlestick') %>%
add_trace(x = ~Date,
open = ~Open, close = ~Close,
high = ~High, low = ~Low,
increasing = list(line = list(color = 'red')), # 증가할 때 색깔
decreasing = list(line = list(color = 'blue'))) %>% # 감소할 때 색깔깔
add_lines(x = ~Date, y = ~Close, # 선 추가가
line = list(color = 'black', width = 0.75)) %>%
layout(showlegend = FALSE)
# Bar Plot with Three Stock Data
## Data 변환환
data2 <- data %>%
select(Date, Name, Volume)
head(data2)
Date Name Volume
2018-01-02 2018-01-02 samsung 8474250
2018-01-03 2018-01-03 samsung 10013500
2018-01-04 2018-01-04 samsung 11695450
2018-01-05 2018-01-05 samsung 9481150
2018-01-08 2018-01-08 samsung 8383650
2018-01-09 2018-01-09 samsung 18013600
data2 <- data2 %>%
tidyr::pivot_wider(names_from = "Name",
values_from = "Volume") %>%
data.frame()
head(data2)
Date samsung kakao lg
1 2018-01-02 8474250 6680627 160040
2 2018-01-03 10013500 5729670 217377
3 2018-01-04 11695450 11242421 238149
4 2018-01-05 9481150 5297057 237488
5 2018-01-08 8383650 7829439 211137
6 2018-01-09 18013600 5017557 382637
plot_ly(data2, type = "bar") %>%
add_trace(x = ~Date,
y = ~samsung,
name = "Samsung",
marker = list(color = 'rgb(22, 96, 167)')) %>%
add_trace(x = ~Date,
y = ~kakao,
name = "Kakao",
marker = list(color = 'rbg(22, 167, 82)')) %>%
add_trace(x = ~Date,
y = ~lg,
name = "LG",
marker = list(color = 'rgb(153, 22, 167)')) %>%
layout(xaxis = list(rangeslider = list(type = "date")),
yaxis = list(title = "Volume")) # Y축 이름
Name Volume
2022-11-16 samsung 12909260
2022-11-161 kakao 2451864
2022-11-162 lg 237822
plot_ly(data3, labels = ~Name, values = ~Volume, type = 'pie') %>%
layout(showlegend = FALSE,
title = "Volume at 2022-11-16") # Title
plot_ly(data3, labels = ~Name, values = ~Volume, type = 'pie',
textposition = 'inside', # 글자 위치 textinfo = 'label+percent', # 글자 타입NA= list(color = '#FFFFFF'), # 글자 색깔 marker = list(colors = c('rgb(211,94,96)', 'rgb(128,133,133)', 'rgb(144,103,167)')) # 파이 색깔NA) %>%
layout(showlegend = FALSE,
title = "Volume at 2022-11-16")